package leetcode.alg.demo;

import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.List;

/**
 * 一个整型数组 nums 里除两个数字之外，其他数字都出现了两次。请写程序找出这两个只出现一次的数字。
 * 要求时间复杂度是O(n)，空间复杂度是O(1)。
 *
 * 示例 1：
 *
 * 输入：nums = [4,1,4,6]
 * 输出：[1,6] 或 [6,1]
 * 示例 2：
 *
 * 输入：nums = [1,2,10,4,1,4,3,3]
 * 输出：[2,10] 或 [10,2]
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-lcof
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class Int_in_arrays_num {
    public static void main(String[] args){
        int[] nums = {4,1,4,6};
        Int_in_arrays_num int_in_arrays_num = new Int_in_arrays_num();
        int[] result = int_in_arrays_num.singleNumbers(nums);
        System.out.println(result);
    }

    /**
     * 100   001   100  110
     */
    public int[] singleNumbers(int[] nums) {
        int res = 0;
        int[] result = {0,0};
        for(int i = 0; i < nums.length; i ++){
            res = res ^ nums[i];
        }

        int checkFlag = 1;
        while ((checkFlag & res) == 0){
            checkFlag <<= 1;
        }
        for(int i = 0; i < nums.length; i ++){
            if((nums[i] & checkFlag) == 0){
                result[0] = result[0] ^ nums[i];
            }else{
                result[1] = result[1] ^ nums[i];
            }
        }
        return result;
    }
}
